import CryptoJS from 'crypto-js'

/**
 * https://github.com/brix/crypto-js
 * https://cryptojs.gitbook.io/docs/#ciphers
 */
export class CryptoAES {
  constructor(iv) {
    // const key = null; // 密钥：十六位十六进制数
    this.custom = {
      iv: CryptoJS.enc.Utf8.parse(iv), // 偏移量：十六位十六进制数
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    }
  }

  /**
   * 加密
   * @param {String|...} message 待加密的明文
   * @param {String} k 密钥
   * @returns {String} base64 密文
   */
  encrypt(message, k) {
    const data = typeof message !== 'string' ? JSON.stringify(message) : message;

    const key = CryptoJS.enc.Utf8.parse(k);
    const { custom } = this;
    const encrypt = CryptoJS.AES.encrypt(data, key, custom);
    const ciphertext = encrypt.ciphertext.toString(); // 密文: Hex String（十六进制字符串）格式
    const words = CryptoJS.enc.Hex.parse(ciphertext); // Hex 转为 WordArray 对象
    const base64 = CryptoJS.enc.Base64.stringify(words); // WordArray 对象转为 Base64
    // console.log('打印 base64: ', base64);
    return base64;
  }

  /**
   * 解密
   * @param {String} message 密文
   * @param {String} k 密钥
   * @returns {String} utf8 解密后的明文
   */
  decrypt(message, k) {
    const key = CryptoJS.enc.Utf8.parse(k);
    const { custom } = this;
    const decrypt = CryptoJS.AES.decrypt(message, key, custom);
    try {
      const utf8 = CryptoJS.enc.Utf8.stringify(decrypt); // 明文 Utf8
      // const utf8 = decrypt.toString(CryptoJS.enc.Utf8); // 同上
      // console.log('打印 utf8: ', utf8);
      return utf8;
    } catch (e) {
      console.log('[LOG] decrypt e: ', e);
      return null;
    }
  }
}